﻿// Version posterior mejorada/simplificada a arKristal_v1.02

// Version 2.0

package motor.colision {
	
	import flash.utils.*;
	import flash.display.*;
	import flash.text.*;
	
	import flash.events.*;
    import flash.utils.Timer;

	
	import motor.colision.*;
	
	public class LineaTiempo extends EventDispatcher
	{		
		public static var EVENT_FIN_ANIMA:String = "EVENT_FIN_ANIMA";
		
		public static var MAX_ITERACIONES = 2;
	
		private var dt:int;		
		public static var tiempoCompleto:int;
		private var iteracionRecusivas:int;/*Le pongo un maximo asi si lo supera elimino el cuerpo o algo.*/
		
		private var timer:Timer;
		
		
		public var lastFrame:Date = null;
		
		private var tiempoUniversal:uint;
		
		public function LineaTiempo (tiempoDT:int)
		{			
			dt=tiempoDT;
			tiempoCompleto=dt;
			iteracionRecusivas=0;
			tiempoUniversal = 0;
			
			timer = new Timer(dt);
			timer.addEventListener(TimerEvent.TIMER,animarDebug);
			timer.addEventListener(TimerEvent.TIMER,animarFin);
			
			timer.start();
		}
		
		public function getTiempoUniversal():uint
		{
			return tiempoUniversal;
		}
				
		private function animarHasta (unTiempo:int):void
		{
			Cuerpos.getInstancia().animarHasta(unTiempo);
			tiempoUniversal+=unTiempo;
		}
		
		public function animarFin (event:TimerEvent):void
		{			
			dispatchEvent(new Event(EVENT_FIN_ANIMA));
		}
		
		private function animarDebug(event:TimerEvent):void
		{
			var currentDate:Date = new Date();			
			var dt:Number = currentDate.time;
			//trace ("LineaTiempo: Evento Timer Animar");
			animar(event);
			currentDate = new Date()
			dt=currentDate.time-dt;
			//trace ("LineaTiempo: Fin Animar! DT: " + dt);
		}
		
		private function animar (event:TimerEvent):void
		{						
			// la recursividad es PELIGROSA, HE VISTO QUE UNA COLISION BOLA & PLATAFORMA SE REPITIO 40 VECES O MAS ...
		
			/*----*/
			iteracionRecusivas++;
			if (iteracionRecusivas>MAX_ITERACIONES) // eL MAXIMO DE ITERACIONES DEBE SER SUPERIOR AL NRO DE CUERPOS Q LAS PUEDAN CAUSAR REALMENTE AL MISMO CUADRO DE TIEMPO!
			{				
				trace ("WARNING: Se alcanzo el maximo de iteraciones/colisiones");
				this.animarHasta (dt)				
				dt=tiempoCompleto;
				iteracionRecusivas=0;
				return;
			}
			
			if (dt==0)
			{
				dt=tiempoCompleto;
				iteracionRecusivas=0;
				return;
			}
			
			var tiempo0:int;
			var colisionMenor:Colision = Cuerpos.getInstancia().colisionMenor();
			if (colisionMenor!=null)
			{
				tiempo0 = colisionMenor.tiempoColision;
				//trace ("Hay alguna colision! y su tiempo es: ",tiempo0);
				if (tiempo0<=dt)
				{
					/*trace ("Esta dentro del DT:",dt);
					trace ("posActual: cuerpo1: ",colisionMenor.cuerpo1.y);
					trace ("Hacemos un animar hasta: ",tiempo0);					*/				
					
					this.animarHasta (tiempo0-0.00001); // ESTO PERMITE QUE LAS COLISIONES Q OCURREN EN CASI IGUAL TIEMPO SE CALCULEN!!!
					Cuerpos.getInstancia().calcularEfectosColision(); // v2.0: Ya sabemos q se hara sombre la colision menor q ya almacena Cuerpos.
					// v2.0: Un ves q se llama a calcularEfectosColision, el FLAG de estado se pone en NO y se recalculara la proxima colision
					
					dt-=tiempo0;
					
					//trace ("Recursividad! donde el DT restante es: ",dt);
					this.animar(null);//OJO recursividad!!!
				} else
				{					
					// DEBUG trace ("Colision Fuera de DT: ",tiempo0," > ",dt," La verdadera:",Colision(cuerpos.colisionMenor()).tiempoColision,"Error: ",Colision(cuerpos.colisionMenor()).tiempoColision-tiempo0);
					//Entrara en otro ciclo.
					this.animarHasta (dt);
					
					Cuerpos.getInstancia().actualizarColisionMenor_tiempoTranscurrido (dt); // PARA MANTENER EL CALCULO
					/*----*/
					dt=tiempoCompleto;
					iteracionRecusivas=0;
					/*----*/					
				}
			} else
			{
				//trace ("No hay colision!");
				this.animarHasta (dt);
				dt=tiempoCompleto;
				iteracionRecusivas=0;				
			}
			//trace ("--------------------------------------")
		}
		
		/*----*/		
		
	}
}